from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import logging
import os
# 不需要再次导入dotenv，因为在main.py中已经导入并加载了
# from dotenv import load_dotenv

# 配置日志记录器
logger = logging.getLogger(__name__)

# 环境变量已在应用初始化时加载，这里不需要再次加载
# load_dotenv()

# 从环境变量获取数据库连接配置
DATABASE_URL = os.getenv("DATABASE_URL")
if not DATABASE_URL:
    logger.warning("未找到环境变量DATABASE_URL，将使用默认连接字符串")
    DATABASE_URL = "mysql+pymysql://root:root%40123@localhost:3306/zqback"
    
# 记录数据库连接信息（隐藏密码信息）
try:
    # 安全地处理连接字符串，避免格式问题导致的错误
    if '@' in DATABASE_URL:
        safe_url = DATABASE_URL.replace(DATABASE_URL.split("@")[0].split(":")[-1], "****")
    else:
        safe_url = DATABASE_URL
    logger.info(f"使用数据库连接: {safe_url}")
except Exception as e:
    logger.warning(f"无法显示安全的数据库URL: {str(e)}")
    logger.info("正在使用配置的数据库连接")

# 创建数据库引擎
try:
    # 从环境变量获取连接池配置
    pool_size = int(os.getenv("DATABASE_POOL_SIZE", "5"))
    max_overflow = int(os.getenv("DATABASE_MAX_OVERFLOW", "10"))
    
    # 创建引擎，添加连接池配置
    engine = create_engine(
        DATABASE_URL,
        pool_size=pool_size,
        max_overflow=max_overflow,
        pool_pre_ping=True,  # 自动检测断开的连接
        pool_recycle=3600    # 连接在池中的最大生存时间（秒）
    )
    logger.debug("数据库引擎创建成功")
except Exception as e:
    logger.error(f"数据库引擎创建失败: {str(e)}")
    raise

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 声明基类
Base = declarative_base()

# 依赖项，获取数据库会话
def get_db():
    """获取数据库会话"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close() 